/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Database.DBConnection;
import Database.PropertiesManager;
import Model.Recurso;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author 0433101
 */
public class RecursoDAO{
     private static HashMap dados;
    
    static{
        try{
    dados = new PropertiesManager("sql.properties").readPropertiesFile();
        } catch (IOException ioe){
            System.out.println(ioe);
        }
    }
    
    public static boolean inserir(String nome_recurso, int quantidade) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(nome_recurso == null){
            return false;
        }
        
        Recurso temp = pesquisarByNome(nome_recurso); 
        Recurso recurso = new Recurso();
        recurso.setNome_recurso(nome_recurso);
        recurso.setQuantidade_disponivel(quantidade);
        recurso.setNome_recurso(nome_recurso);
        recurso.setQuantidade_disponivel(quantidade);
        
        if(temp == null){
            String sql = loadSQL("Insert.Recurso");
            PreparedStatement pstmt = conexao.prepareStatement(sql);
            if(recurso.getNome_recurso().equals("") || recurso.getNome_recurso() == null){
                return false;
            }
            else{
                pstmt.setString(1, recurso.getNome_recurso());
            }
            
            if(recurso.getQuantidade_disponivel() >= -1){
                pstmt.setInt(2, recurso.getQuantidade_disponivel());
            }
            else{
                return false;
            }

            pstmt.executeUpdate(); // tbm funciona com pstmt.execute();
            return true;
        }
        return false;
    } 
    
    public static Recurso pesquisarById(int id) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectById.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        Recurso recurso = null;
        
        if(rs.next()){
            String nome = rs.getString("NOME_RECURSO");
            int quantidade = rs.getInt("RECURSO_DISPONIVEL");
            recurso = new Recurso();
            recurso.setId_recurso(id);
            recurso.setNome_recurso(nome);
            recurso.setQuantidade_disponivel(quantidade);
        }
        return recurso;
    }
    
    public static Recurso pesquisarByNome(String nome) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByNome.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setString(1, nome);
        ResultSet rs = pstmt.executeQuery();
        Recurso recurso = null;
        if(rs.next()){
            int id = rs.getInt("ID_RECURSO");
            int quantidade = rs.getInt("RECURSO_DISPONIVEL");
            
            recurso = new Recurso();
            recurso.setId_recurso(id);
            recurso.setNome_recurso(nome);
            recurso.setQuantidade_disponivel(quantidade);
        }
        return recurso;
    } 
    
    public static ArrayList<Recurso> pesquisarAll() throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("Select.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Recurso> recursos = new ArrayList<Recurso>();
        
        while(rs.next()){
            
            int id = rs.getInt("ID_RECURSO");
            String nome = rs.getString("NOME_RECURSO");
            int quantidade = rs.getInt("RECURSO_DISPONIVEL");
            
            Recurso recurso = new Recurso();
            recurso.setId_recurso(id);
            recurso.setNome_recurso(nome);
            recurso.setQuantidade_disponivel(quantidade);
            recursos.add(recurso);
        }
        
        return recursos;
    }    
    
    public static boolean updateRecurso(int id, String nome, int quantidade, String nomeAntes) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(!nomeAntes.equals(nome)){
            Recurso temp = pesquisarByNome(nome);
            if(temp != null){
                return false;
            }
        }
        
        String sql = loadSQL("Update.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);        
        pstmt.setString(1, nome);
        pstmt.setInt(2, quantidade);
        pstmt.setInt(3, id);

        pstmt.executeUpdate();  
        return true;
    }
    
    public static boolean acrescentarRecurso(int id, int quantidade) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(id <= 0 || quantidade <= 0){
            return false;
        }
        
        String sql = loadSQL("Acrescentar.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, quantidade);
        pstmt.setInt(2, id);

        pstmt.executeUpdate();  
        return true;
    }
    
    public static boolean diminuirRecurso(int id, int quantidade) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(id <= 0 || quantidade <= 0){
            return false;
        }
        
        int disp = RecursoDAO.pesquisarById(id).getQuantidade_disponivel();
        
        if(quantidade > disp){
            return false;
        }
        
        String sql = loadSQL("Diminuir.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, quantidade);
        pstmt.setInt(2, id);

        pstmt.executeUpdate();  
        return true;
    }
    
    public static boolean removerRecurso(int id_recurso) throws SQLException, ClassNotFoundException, IOException{
        EspacoRecursoDAO.removerRecurso(id_recurso);
        
        
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("Delete.Recurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_recurso);
        pstmt.execute();
        
        return true;
    }
    
    private static String loadSQL(String key){
        String sql=null;
        sql = (String) dados.get(key);
        return sql;
    }    
}
